#include <browserconf.h>
#include <QString>
#include <QFile>
#include <QList>
#include <QTextStream>
#include <QObject>
#include <QEvent>
#include <QMessageBox>

BrowserConf::BrowserConf(QWidget *parent) : QWidget(parent)
{
	pStartPage = new QUrl();

	if ( !this->lerArquivo() )	// setando valores default
	{
		pStartPage->setUrl( "http://www.8teenfiles.com/gals/awinters/danickapinch/013.jpg" );
		hasProxy = 0;
		proxy.setHostName( "cache.uel.br" );
		proxy.setPort( 8080 );
		hasAuthentication = 0;
		proxy.setUser( "uel" );
		proxy.setPassword( "londrina" );
	}

	ui.setupUi( this );

	QObject::connect( ui.pushButton_save, SIGNAL(clicked()), this, SLOT(validateAndSave()) );

	setUistartPage();

	setUiproxy();
}


/* inicio da manipulação do arquivo */

bool
BrowserConf::lerArquivo()
{
	pConfFile = new QFile( "browserconf.txt" );
	if ( !QFile::exists( "browserconf.txt" ) )	// arquivo nao existe, vaza.
	{
		pConfFile->open( QIODevice::WriteOnly | QIODevice::Text );
		pConfFile->close();
		return false;
	}
    if (!pConfFile->open(QIODevice::ReadOnly | QIODevice::Text))
    {
    	// erro de abertura de arquivo!
    	// todo: addexception
        return false;
    }

    QList<QString>
    lines;

    while (!pConfFile->atEnd())
    {
        lines.append(pConfFile->readLine());
    }

    pConfFile->close();

    if ( lines.isEmpty() || lines.size() < 7 )	// se nao encontrar nada no arquivo, entao ele nao existia...
    {
    	return false;
    }
    else	// entao ja tinha alguma coisa la!
    {
		pStartPage->setUrl( lines.front() );
		lines.pop_front();

		bool
		ok;

		hasProxy = lines.front().toInt( &ok, 10 );
		lines.pop_front();

		if ( !ok )	// conversão falhou
		{
			// todo: addexception
			return false;
		}

		proxy.setHostName( lines.front() );
		lines.pop_front();

		proxy.setPort( lines.front().toInt( &ok, 10 ) );
		lines.pop_front();
		if ( !ok )	// conversão falhou
		{
			// todo: addexception
			return false;
		}

		hasAuthentication = lines.front().toInt( &ok, 10 );
		lines.pop_front();
		if ( !ok )	// conversão falhou
		{
			// todo: addexception
			return false;
		}

		proxy.setUser( lines.front() );
		lines.pop_front();

		proxy.setPassword( lines.front() );
    }
    return true;
}

bool
BrowserConf::salvarArquivo()
{
	if ( ! pConfFile->open( QIODevice::WriteOnly | QIODevice::Text ) )
	{
		// abertura falhou
		// todo: addexception
		return false;
	}

	QTextStream
	saidaFile( pConfFile );

	saidaFile << pStartPage->toString( /*QUrl::RemoveAuthority*/ ) << "\n";
	saidaFile << hasProxy << "\n";
	saidaFile << proxy.hostName() << "\n";
	saidaFile << proxy.port() << "\n";
	saidaFile << hasAuthentication << "\n";
	saidaFile << proxy.user() << "\n";
	saidaFile << proxy.password() << "\n";

	pConfFile->close();

	return true;
}

/* fim da manipulacao do arquivo */

// inicio de alguma coisa ae

QUrl*
BrowserConf::getStartPage()
{
	return pStartPage;
}

void
BrowserConf::setProxy()
{
	QNetworkProxy::setApplicationProxy( proxy );
}


// fim de alguma coisa ae

/* inicio da manipulação com dados da interface */

void
BrowserConf::setUiproxy()
{
	if (hasProxy == 1)
	{
		ui.checkBox_proxy->setChecked( true );
	}
	ui.lineEdit_cacheAddress->setText( proxy.hostName().trimmed() );
	ui.spinBox_port->setValue( proxy.port() );
	if ( hasAuthentication == 1 )
	{
		ui.checkBox_authentication->setChecked( true );
	}
	ui.lineEdit_user->setText( proxy.user().trimmed() );
	ui.lineEdit_password->setText( proxy.password().trimmed() );
}

void
BrowserConf::getUiproxy()
{
	if ( ui.checkBox_proxy->isChecked() )
	{
		hasProxy = 1;
		proxy.setType( QNetworkProxy::HttpProxy );
	}
	else
	{
		hasProxy = 0;
		proxy.setType( QNetworkProxy::NoProxy );
	}
	proxy.setHostName( ui.lineEdit_cacheAddress->text() );
	proxy.setPort( ui.spinBox_port->value() );
	if ( ui.checkBox_authentication->isChecked() )
	{
		hasAuthentication = 1;
	}
	else
	{
		hasAuthentication = 0;
	}
	proxy.setUser( ui.lineEdit_user->text() );
	proxy.setPassword( ui.lineEdit_password->text() );
}

void
BrowserConf::setUistartPage()
{
	ui.lineEdit_startPage->setText( pStartPage->toString( /*QUrl::RemoveAuthority*/ ).trimmed() );
}

void
BrowserConf::getUistartPage()
{
	pStartPage->setUrl( ui.lineEdit_startPage->text() );
}

/* fim da manipulação com dados da interface */


/* inicio private slots */

void
BrowserConf::validateAndSave()
{
	/* teste relativo ao campo lineEdit_startPage */
	QString s = ui.lineEdit_startPage->text();
	// trunca a string no primeiro espaço em branco encontrado
	int i=0;
	while ( !(s[i].isSpace()) && s.size() > i ) {i++;}
	s.truncate(i);
	s = s.toLower();

	if ( s.isEmpty() )	// pagina inicial em branco
	{
		(void) QMessageBox::warning( this, "Campo vazio", QString::fromUtf8( "Insira uma página inicial" ), QMessageBox::Ok, QMessageBox::Ok );
		return;
	}
	else if ( !s.startsWith( "http://" ) )
	{
		s.prepend( "http://" );
	}
	ui.lineEdit_startPage->setText( s );
	i=0;

	/* quando o checkBox_proxy estiver habilitado */
	if ( ui.checkBox_proxy->isChecked() )
	{
		s = ui.lineEdit_cacheAddress->text();

		// truncando no primeiro espaco em branco
		while ( !(s[i].isSpace()) && s.size() > i ) {i++;}
		s.truncate(i);

		s = s.toLower();

		if ( s.isEmpty() )	// proxy address vazio
		{
			(void) QMessageBox::warning( this, "Campo vazio", QString::fromUtf8( "Insira o endereço do proxy" ), QMessageBox::Ok, QMessageBox::Ok );
			return;
		}
		ui.lineEdit_cacheAddress->setText( s );
		i=0;

		if ( ui.spinBox_port->value() == 0 )	// porta = 0
		{
			(void) QMessageBox::warning( this, "Valor inválido", QString::fromUtf8( "Insira uma porta para o proxy" ), QMessageBox::Ok, QMessageBox::Ok );
			return;
		}
		if ( ui.checkBox_authentication->isChecked() )
		{
			s = ui.lineEdit_user->text();

			// truncando no primeiro espaco em branco
			while ( !(s[i].isSpace()) && s.size() > i ) {i++;}
			s.truncate(i);

			s = s.toLower();

			if ( s.isEmpty() )	// username em branco
			{
				(void) QMessageBox::warning( this, "Campo vazio", QString::fromUtf8( "Insira o nome do usuário do proxy" ), QMessageBox::Ok, QMessageBox::Ok );
				return;
			}
			ui.lineEdit_user->setText( s );
			i=0;

			s = ui.lineEdit_password->text();

			// truncando no primeiro espaco em branco
			while ( !(s[i].isSpace()) && s.size() > i ) {i++;}
			s.truncate(i);

			if ( s.isEmpty() )	// password em branco
			{
				(void) QMessageBox::warning( this, "Campo vazio", QString::fromUtf8( "Insira a senha do usuário do proxy" ), QMessageBox::Ok, QMessageBox::Ok );
				return;
			}
			ui.lineEdit_password->setText( s );
		}
	}

	getUistartPage();
	getUiproxy();

	salvarArquivo();

	setProxy();

	close();
}

/* fim private slots */

